﻿/********************************************************************************/
/* 	actor.d																		*/
/*------------------------------------------------------------------------------*/
/*	製作		（　゜ワ゜）ノ　／　松久貫太									*/
/*	製作開始　	2007/05/11														*/
/*	MAIL		omega@personal.email.ne.jp										*/
/*	URL		http://nagoya.cool.ne.jp/o_mega										*/
/*																				*/
/*	このソースは「やわらかライセンス」の元で配布されています。					*/
/*-更新履歴---------------------------------------------------------------------*/
/*	2007/--/--																	*/
/*-その他-----------------------------------------------------------------------*/
/*	なし																		*/
/********************************************************************************/

import vector;

class Actor
{
public:
	Vec3 position;
	bool exist;
	
	enum DRAW_PRIORITY{
		FIRST,
		BACK,
		NORMAL,
		FRONT,
		LAST,
	}
	
	this()
	{
		exist = false;
	}
	
	void move()
	{
	}
	
	void draw(DRAW_PRIORITY dp = DRAW_PRIORITY.NORMAL)
	{
	}
}

class ActorPool(T)
{
private:
	int index = 0;
	int count = 0;
public:
	T[] actors;
	
	this(int n)
	{
		actors = new T[n];
		foreach(inout T a;actors)
		{
			a = new T;
		}
		index = 0;
		count = n;
	}
	
	int getCount(){return count;}
	
	void move()
	{
		foreach(inout T a;actors)
		{
			if(a.exist)
			{
				a.move();
			}
		}
	}
	
	void draw()
	{
		foreach(inout T a;actors)
		{
			if(a.exist)
			{
				a.draw();
			}
		}
	}
	
	T getInstance()
	{
		for(int t = 0 ; t < actors.length ; t++)
		{
			index--;
			if(index < 0)
			{
				index = actors.length - 1;
			}
			if(!actors[index].exist)
			{
				return actors[index];
			}
		}
		return null;
	}
	
	T getInstanceForced()
	{
		index--;
		if(index < 0)
		{
			index = actors.length - 1;
		}
		return actors[index];
	}
	
	int countExist()
	{
		int result = 0;
		foreach(T a;actors)
		{
			if(a.exist) result++;
		}
		return result;
	}
	
	T getNearest(Vec3 pos){
		float dist = 99999999.9;
		T result = null;
		
		foreach(T a;actors){
			if(a.exist == false) continue;
			
			if(a.position.getDist(pos) < dist){
				dist = a.position.getDist(pos);
				result = a;
			}
		}
		
		return result;
	}
}